# import requests
# from collections import deque
# from fastapi import fastapi
# import sqlmodel


'''
数据结构：列表，字典，元组
5.1. 列表详解¶
列表数据类型支持很多方法，列表对象的所有方法所示如下：

list.append(x)
在列表末尾添加一项。 类似于 a[len(a):] = [x]。

list.extend(iterable)
通过添加来自 iterable 的所有项来扩展列表。 类似于 a[len(a):] = iterable。

list.insert(i, x)
在指定位置插入元素。第一个参数是插入元素的索引，因此，a.insert(0, x) 在列表开头插入元素， a.insert(len(a), x) 等同于 a.append(x) 。

list.remove(x)
从列表中删除第一个值为 x 的元素。未找到指定元素时，触发 ValueError 异常。

list.pop([i])
移除列表中给定位置上的条目，并返回该条目。 如果未指定索引号，则 a.pop() 将移除并返回列表中的最后一个条目。 如果列表为空或索引号在列表索引范围之外则会引发 IndexError。

list.clear()
移除列表中的所有项。 类似于 del a[:]。

list.index(x[, start[, end]])
返回列表中第一个值为 x 的元素的零基索引。未找到指定元素时，触发 ValueError 异常。

可选参数 start 和 end 是切片符号，用于将搜索限制为列表的特定子序列。返回的索引是相对于整个序列的开始计算的，而不是 start 参数。

list.count(x)
返回列表中元素 x 出现的次数。

list.sort(*, key=None, reverse=False)
就地排序列表中的元素（要了解自定义排序参数，详见 sorted()）。

list.reverse()
翻转列表中的元素。

list.copy()
返回列表的浅拷贝。 类似于 a[:]
'''
# 列表
# a = list()
# b = []
#
# # add list
# a.append('abc')
# print(a)
# b.append('asd')
# print(b)
#
# # 删除列表元素
# a.remove('abc')
# print(a)
#
# a.copy()
# # a.pop()
# a.extend([1, 2, 3])
# print(a)
#
# a.clear()  # 移除列表中的所有项。 类似于 del a[:]。
# a.count(1) # 返回列表中元素 x 出现的次数。

# 列表推导式¶
# 列表推导式创建列表的方式更简洁。常见的用法为，对序列或可迭代对象中的每个元素应用某种操作，用生成的结果创建新的列表；或用满足特定条件的元素创建子序列。

# squares = []
# for x in range(10):
#     squares.append(x**2)
#     print(squares)
#
# squares =list(map(lambda x: x**2, range(10)))
#
# squares = [x**2 for x in range(10)]
#
#
# combs = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
# [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
# 相互等价
# 先算前面的，后计算后面， 从前到后计算循环
# combs = []
# for x in [1,2,3]:
#     for y in [3,1,4]:
#         if x != y:
#             combs.append((x, y))
#
# combs
# [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

# 创建一个包含 (数字, 平方) 2 元组的列表
# [(x, x**2) for x in range(6)]
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
# # 元组必须加圆括号，否则会引发错误
# [x, x**2 for x in range(6)]
#   File "<stdin>", line 1
#     [x, x**2 for x in range(6)]




# 嵌套的列表推导式¶
matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]
# list_rows = list(
#     zip(*matrix))
# print(list_rows)

# for x in zip(*matrix):
#     print(x)
# for x in matrix:
#     print(x)


#  集合set 创建集合用花括号或 set() 函数。注意，创建空集合只能用 set()，不能用 {}，{} 创建的是空字典

# 与 列表推导式 类似，集合也支持推导式：
a = {x for x in 'abracadabra' if x not in 'abc'}

# 字典  最简单的是 kv
a_dict = {}
b_dict = dict()

a_dict['abc'] = 123  # 添加
a_dict['abc']
print(a_dict)

# 字典推导式可以用任意键值表达式创建字典：
aoe = {x: x**2 for x in (2, 4, 6)}
# {2: 4, 4: 16, 6: 36}

# items()
# 返回由字典项 ((键, 值) 对) 组成的一个新视图

knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
    print(k, v)

# 在序列中循环时，用 enumerate() 函数可以同时取出位置索引和对应的值：
for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)

# 同时循环两个或多个序列时，用 zip() 函数可以将其内的元素一一匹配：


questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
    print('What is your {0}?  It is {1}.'.format(q, a))

# 为了逆向对序列进行循环，可以求出欲循环的正向序列，然后调用 reversed() 函数：
for i in reversed(range(1, 10, 2)):
    print(i)  # 9,8,7,6,5,4,3,1

# 按指定顺序循环序列，可以用 sorted() 函数，在不改动原序列的基础上，返回一个重新的序列：
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(basket):
    print(i)


# 使用 set() 去除序列中的重复元素。使用 sorted() 加 set() 则按排序后的顺序，循环遍历序列中的唯一元素：
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
    print(f)